﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Ventas
{
    public class GetOrdenVentaList
    {
        int _count;


        public GetOrdenVentaList()
        {
            bol = new OrdenVentaBL();
            emp = new EmpleadoBL();
        }

        OrdenVentaBL bol;
        EmpleadoBL emp;


        public int Count(int idProyecto, DateTime fechaInicio,
                                                        DateTime fechaFin, int idEtapa,
                                                        int idTipoVivienda,
                                                             string cuentaAhorroStr, 
                                                           string estadoStr, 
                                                           string clienteStr, string cuiStr, string numDocumento,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            return _count;
        }



        public int Count(int idCliente, 
                        int startRowIndex,
                        int maximumRows,
                        string sortExpression)
        {
            return _count;
        }



        private IQueryable<OrdenVentaListInfo> ApplySelect_ListInfo()
        {
            DAL.Menu ordenVentaRead = DbUtil.Db.Menus.Single(p => p.idInternal == 114);

            var q = from a in DbUtil.Db.OrdenVentaItems
                    select new OrdenVentaListInfo
                    {
                        bancoStr=(a.OrdenVenta.idBanco!=null)?a.OrdenVenta.Banco.descripcion:"",
                        idCliente=a.OrdenVenta.idCliente,
                        idCliente2=a.OrdenVenta.idCoCliente,
                        fecha=a.OrdenVenta.fecha,
                        fechaStr=a.OrdenVenta.fecha.ToShortDateString(),
                        fechaVenta=a.OrdenVenta.fechaVenta,
                        formatoVentaStr=a.OrdenVenta.FormatoVenta.descripcion,
                        clienteStr=a.OrdenVenta.Cliente.descripcion,
                        idInternal=a.OrdenVenta.idInternal,
                        numDocumento=a.OrdenVenta.numDocumento,
                        vendedorstr=a.OrdenVenta.Empleado.descripcion,
                        idEstado=a.OrdenVenta.idEstado,
                        proyectoStr=a.OrdenVenta.Proyecto.descripcion, 
                        estadoStr = a.OrdenVenta.EstadoItem.descripcion,
                        cuentaAhorro = a.OrdenVenta.cuentaAhorro,
                        idProyecto=a.OrdenVenta.idProyecto,
                        codigo=a.UI.codigo,
                        descripcion=a.UI.descripcion,
                        localizacion=a.UI.UILocalizacion.descripcion,
                        piso=a.UI.UIBloque.descripcion,
                        moneda=a.UI.Moneda,
                        total=a.total,
                        idTipoVivienda=a.UI.idTipoUI,
                        idEtapa=a.UI.idEtapa,
                        pago=a.OrdenVentaFormatos.Sum(p=>p.totalPago),
                         //---------------
                        minFechaPrintStr = (a.OrdenVenta.OrdenVentaSeg.minFechaPrint != null ? a.OrdenVenta.OrdenVentaSeg.minFechaPrint.Value.ToShortDateString(): ""),
                        minFechaFirmClienteStr = (a.OrdenVenta.OrdenVentaSeg.minFechaFirmCliente != null ? a.OrdenVenta.OrdenVentaSeg.minFechaFirmCliente.Value.ToShortDateString() : ""),
                        minfechaFirmEmpresaStr = (a.OrdenVenta.OrdenVentaSeg.minfechaFirmEmpresa != null ? a.OrdenVenta.OrdenVentaSeg.minfechaFirmEmpresa.Value.ToShortDateString() : ""),
                        minfechaFirmBancoStr = (a.OrdenVenta.OrdenVentaSeg.minfechaFirmBanco != null ? a.OrdenVenta.OrdenVentaSeg.minfechaFirmBanco.Value.ToShortDateString() : ""),

                        envioNotariaStr = (a.OrdenVenta.OrdenVentaSeg.envioNotaria != null ? a.OrdenVenta.OrdenVentaSeg.envioNotaria.Value.ToShortDateString() : ""),
                        envioBancoStr = (a.OrdenVenta.OrdenVentaSeg.envioBanco != null ? a.OrdenVenta.OrdenVentaSeg.envioBanco.Value.ToShortDateString() : ""),
                        envioCofideStr = (a.OrdenVenta.OrdenVentaSeg.envioCofide != null ? a.OrdenVenta.OrdenVentaSeg.envioCofide.Value.ToShortDateString() : ""),
                        envioFMVStr = (a.OrdenVenta.OrdenVentaSeg.envioFMV != null ? a.OrdenVenta.OrdenVentaSeg.envioFMV.Value.ToShortDateString() : ""),


                        escriturakardexStr = (a.OrdenVenta.OrdenVentaSeg.escriturakardex != null ? a.OrdenVenta.OrdenVentaSeg.escriturakardex.Value.ToShortDateString() : ""),
                        escrituraKardexNumStr = a.OrdenVenta.OrdenVentaSeg.escrituraKardexNum.ToString(),
                        escrituraPrintStr = (a.OrdenVenta.OrdenVentaSeg.escrituraPrint != null ? a.OrdenVenta.OrdenVentaSeg.escrituraPrint.Value.ToShortDateString() : ""),
                        escrituraFirmClienteStr = (a.OrdenVenta.OrdenVentaSeg.escrituraFirmCliente != null ? a.OrdenVenta.OrdenVentaSeg.escrituraFirmCliente.Value.ToShortDateString() : ""),
                        escrituraFirmEmpresaStr = (a.OrdenVenta.OrdenVentaSeg.escrituraFirmEmpresa != null ? a.OrdenVenta.OrdenVentaSeg.escrituraFirmEmpresa.Value.ToShortDateString() : ""),

                        escrituraFirmBancoStr = (a.OrdenVenta.OrdenVentaSeg.escrituraFirmBanco != null ? a.OrdenVenta.OrdenVentaSeg.escrituraFirmBanco.Value.ToShortDateString() : ""),
                        legalInsClienteStr = (a.OrdenVenta.OrdenVentaSeg.legalInsCliente != null ? a.OrdenVenta.OrdenVentaSeg.legalInsCliente.Value.ToShortDateString() : ""),
                        legalEntregaStr = (a.OrdenVenta.OrdenVentaSeg.legalEntrega != null ? a.OrdenVenta.OrdenVentaSeg.legalEntrega.Value.ToShortDateString() : ""),
                        legalHipotOtroBancoStr = (a.OrdenVenta.OrdenVentaSeg.legalHipotOtroBanco != null ? a.OrdenVenta.OrdenVentaSeg.legalHipotOtroBanco.Value.ToShortDateString() : ""),
                        //------------------------
                        
                        //loadTabFromForm('TAB','TITULO TAB','Formulario')
                        //----------TAB-> tab(idpplicacion-id)
                         formulario=string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idProyecto={1}');",
                                ordenVentaRead.idAplicacion,
                                a.OrdenVenta.idProyecto,
                                a.OrdenVenta.Proyecto.descripcion,
                                ordenVentaRead.url,
                                a.OrdenVenta.idInternal),
                         //-------------------------------
                        ordenVentaFormatos=a.OrdenVentaFormatos,
                    };
            return q;
        }
        private IQueryable<OrdenVentaListInfo> ApplySort(IQueryable<OrdenVentaListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "numDocumento":
                    q = q.OrderBy(b => b.numDocumento);
                    break;
                case "numDocumento DESC":
                    q = q.OrderByDescending(b => b.numDocumento);
                    break;

                case "estadoStr":
                    q = q.OrderBy(b => b.estadoStr);
                    break;
                case "estadoStr DESC":
                    q = q.OrderByDescending(b => b.estadoStr);
                    break;

                case "bancoStr":
                    q = q.OrderBy(b => b.bancoStr);
                    break;
                case "bancoStr DESC":
                    q = q.OrderByDescending(b => b.bancoStr);
                    break;

                case "fechaVenta":
                    q = q.OrderBy(b => b.fechaVenta);
                    break;
                case "fechaVenta DESC":
                    q = q.OrderByDescending(b => b.fechaVenta);
                    break;

                case "clienteStr":
                    q = q.OrderBy(b => b.clienteStr);
                    break;
                case "clienteStr DESC":
                    q = q.OrderByDescending(b => b.clienteStr);
                    break;


                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;

                case "total":
                    q = q.OrderBy(b => b.total);
                    break;
                case "total DESC":
                    q = q.OrderByDescending(b => b.total);
                    break;


                case "proyectoStr":
                    q = q.OrderBy(b => b.proyectoStr);
                    break;
                case "proyectoStr DESC":
                    q = q.OrderByDescending(b => b.proyectoStr);
                    break;

                


                case "formatoVentaStr":
                    q = q.OrderBy(b => b.formatoVentaStr);
                    break;
                case "formatoVentaStr DESC":
                    q = q.OrderByDescending(b => b.formatoVentaStr);
                    break;


                case "vendedorstr":
                    q = q.OrderBy(b => b.vendedorstr);
                    break;
                case "vendedorstr DESC":
                    q = q.OrderByDescending(b => b.vendedorstr);
                    break;
                default:
                    q = q.OrderByDescending(b => b.numDocumento).OrderByDescending(p => p.fecha);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<OrdenVentaListInfo> Execute(int idProyecto,
                                                        DateTime fechaInicio,
                                                        DateTime  fechaFin,
                                                        string idEtapa,
                                                        string idTipoVivienda,
                                                        string cuentaAhorroStr,
                                                            string estadoStr,
                                                        string clienteStr, string cuiStr, string numDocumento,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
           

            if (!clienteStr.HasValue())
                clienteStr = "";
            if (!cuiStr.HasValue())
                cuiStr = "";
            if (!numDocumento.HasValue())
                numDocumento = "";
            var q = ApplySelect_ListInfo();

            
            


            q = q.Where(a => (a.descripcion.Contains(cuiStr))
                              & (int.Parse(cuentaAhorroStr) == 0 ? a.cuentaAhorro != 0 : a.cuentaAhorro == int.Parse(cuentaAhorroStr))
                              & a.clienteStr.Contains(clienteStr)
                              & a.numDocumento.Contains(numDocumento)
                              & (a.fecha>=fechaInicio & a.fecha<=fechaFin)
                              & a.idProyecto == idProyecto
                              & (idEtapa == "0" ? a.idEtapa != 0 :a.idEtapa== Convert.ToInt32(idEtapa)) //para el caso de separado y vendido

                              & (idTipoVivienda == "0" ? a.idTipoVivienda != 0 : a.idTipoVivienda == Convert.ToInt32(idTipoVivienda))
                              & (estadoStr == "0" ? a.idEstado != 0 : (estadoStr=="-1"?(a.idEstado!=10) :a.idEstado == Convert.ToInt32(estadoStr)) )
                              );


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<OrdenVentaListInfo> Execute(int idCliente,
                                                        int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {




           

            
            var q = ApplySelect_ListInfo();

            q = q.Where(a => a.idEstado!=10 //anulado
                             & (a.idCliente==idCliente
                             | (a.idCliente2 != null ? a.idCliente2.Value == idCliente : a.idCliente == idCliente))
                              & emp.GetProyectosAcceso().Contains(a.idProyecto));


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }



    }
}
